﻿#Requires AutoHotkey v2.0

#Include ..\Extend.ahk

; 此脚本提供简便的命令行参数处理
; 可以为参数注册对应的回调函数，比如：当给脚本传递 `p1` 参数时，执行某个函数
;
; 此脚本只适合参数都是 bool 类型的情况

; A_Args := ['p1']  ; 假设传递了参数 p1
; cpa := CmdLineParamAction()
; cpa.CheckExist('p1')  ; 检查是否存在参数
; cancel := cpa.AddActionByParam('p1', (*) => MsgBox(11))  ; 注册回调
; cpa.AddActionByParam('p1', (*) => MsgBox(22))  ; 注册回调
; cancel() ; 取消回调
; cpa.ExecActions()  ; 执行

class CmdLineParamAction {

  __New(caseSense := false) {
    this.cbMapping := {}
    this.cbMapping.CaseSense := caseSense
  }

  ; 检查参数是否存在
  CheckExist(param) => A_Args.includes(param)

  ; 为参数添加回调
  AddActionByParam(param, cb) {
    m := this.cbMapping
    if not m[param]
      m[param] := []
    m[param].Push(cb), i := m[param].Length
    return (*) => m[param].Delete(i)
  }

  ; 执行回调，可以指定仅执行某参数的回调，如果 A_Args 中不存在，则不会运行回调
  ExecActions(param?) {
    if IsSet(param) {
      _execAction(param)
      return
    }
    A_Args.foreach(_execAction)

    _execAction(param, *) {
      if this.CheckExist(param) && !this.cbMapping[param]
        return false
      for v in this.cbMapping[param]
        if IsSet(v)
          v()
    }
  }
}